﻿using System.ComponentModel.DataAnnotations;

namespace IssueVision.EntityModel
{
    /// <summary>
    /// PasswordResetUser class client-side extensions
    /// </summary>
    public partial class PasswordResetUser
    {
        /// <summary>
        /// Stores the password the user entered in the registration UI, 
        /// even if it is invalid. This way we can validate the password
        /// confirmation adequately all the times   
        /// </summary>
        /// <remarks>
        /// This gets set on the <see cref="System.Windows.Controls.PasswordBox.PasswordChanged"/> event
        /// </remarks>
        public string ActualPassword { get; set; }

        [Display(Name = "Confirm password")]
        [Required(ErrorMessage = "This field is required.")]
        [CustomValidation(typeof(PasswordResetUser), "CheckPasswordConfirmation")]
        public string PasswordConfirmation
        {
            get { return _passwordConfirmation; }
            set
            {
                if (_passwordConfirmation != value)
                {
                    PropertySetterEntry("PasswordConfirmation");
                    _passwordConfirmation = value;
                    PropertySetterExit("PasswordConfirmation", value);
                    OnPropertyChanged("PasswordConfirmation");
                }
            }
        }
        private string _passwordConfirmation;

        /// <summary>
        /// Custom validation of whether new password and confirm password match
        /// </summary>
        /// <param name="passwordConfirmation"></param>
        /// <param name="validationContext"></param>
        /// <returns></returns>
        public static ValidationResult CheckPasswordConfirmation(string passwordConfirmation, ValidationContext validationContext)
        {
            PasswordResetUser currentUser = (PasswordResetUser)validationContext.ObjectInstance;

            if (!string.IsNullOrEmpty(currentUser.ActualPassword) &&
                !string.IsNullOrEmpty(passwordConfirmation) &&
                currentUser.ActualPassword != passwordConfirmation)
            {
                return new ValidationResult("Passwords do not match.", new[] { "PasswordConfirmation" });
            }

            return ValidationResult.Success;
        }
    }
}
